package com.baoyouqun.controller.back;

import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baoyouqun.base.PageResponse;
import com.baoyouqun.domain.CreateCmd.BackUserCreateCmd;
import com.baoyouqun.domain.Query.UserQuery;
import com.baoyouqun.domain.UpdateCmd.BackUserUpdateCmd;
import com.baoyouqun.domain.UpdateCmd.UserUpdateCmd;
import com.baoyouqun.domain.VO.RoleVO;
import com.baoyouqun.domain.VO.UserDetailVO;
import com.baoyouqun.domain.VO.UserVO;
import com.baoyouqun.domain.cmd.ExportUserCmd;
import com.baoyouqun.domain.cmd.ResetPasswordCmd;
import com.baoyouqun.service.RoleService;
import com.baoyouqun.service.UserRoleService;
import com.baoyouqun.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("back/backUser") // 与您现有UserController路径一致
@Api(tags = "后台_用户管理接口") // Swagger标签匹配风格
public class BackUserManageController {

    // 依赖注入：保持@Resource注解，与您现有代码一致
    @Resource
    private UserService userService;
    @Resource
    private UserRoleService userRoleService;
    @Resource
    private RoleService roleService;


    // ====================== 1. 用户基础CRUD接口 ======================

    /**
     * 分页查询后台用户（带筛选条件，返回详情）
     * 对应页面：用户列表页（显示用户+角色+状态等完整信息）
     */
    @GetMapping("backUserPage")
    @ApiOperation("分页查询后台用户（含角色详情）")
    public PageResponse<UserDetailVO> backUserPage(@Valid UserQuery query) {
        // 调用Service层分页查询（复用您现有Service逻辑）
        IPage<UserDetailVO> userPage = userService.backUserPage(query);
        // 封装成PageResponse返回（与您现有分页格式一致）
        return PageResponse.of(
                userPage.getRecords(),
                userPage.getTotal(),
                userPage.getCurrent(),
                userPage.getSize()
        );
    }

    /**
     * 新增后台用户（自动标记为后台工作人员）
     * 对应页面：用户新增弹窗
     */
    @PostMapping("createBackUser")
    @ApiOperation("新增后台用户")
    public SingleResponse<UserVO> createBackUser(@Valid @RequestBody BackUserCreateCmd cmd) {
        // 强制标记为后台用户（与您现有create接口逻辑一致）
        cmd.setBackWorker(true);
        // 调用Service保存并返回用户VO
        return userService.createBackUser(cmd);
    }

    /**
     * 修改后台用户信息（基础信息+角色关联）
     * 对应页面：用户编辑弹窗
     */
    @PutMapping("updateBackUser")
    @ApiOperation("修改后台用户信息")
    public Response updateBackUser(@Valid @RequestBody BackUserUpdateCmd cmd) {
        // 调用Service更新（含参数校验，失败返回错误信息）
        return userService.updateBackUser(cmd);
    }


    // ====================== 2. 用户状态管理接口 ======================

    /**
     * 启用/禁用后台用户（单个操作）
     * 对应页面：用户列表页「启用/禁用」按钮（状态切换）
     */
    @PutMapping("disEnable")
    @ApiOperation("启用/禁用后台用户")
    public Response disEnableBackUser(@Valid @RequestBody UserUpdateCmd cmd) {
        if (cmd.getId() == null || cmd.getId().trim().isEmpty()) {
            return Response.buildFailure("100301", "用户ID不能为空");
        }
        if (cmd.getDisEnable() == null) {
            return Response.buildFailure("100301", "请指定启用/禁用状态");
        }
        // 调用Service修改状态（您现有Service已实现该方法）
        return userService.disEnable(cmd);
    }


    // ====================== 3. 用户密码管理接口 ======================

    /**
     * 重置后台用户密码（无需旧密码）
     * 对应页面：用户列表页「重置密码」按钮
     */
    @PostMapping("resetPassword")
    @ApiOperation("重置后台用户密码")
    public Response resetBackUserPassword(@Valid @RequestBody ResetPasswordCmd cmd) {
        if (cmd.getUserId() == null || cmd.getUserId().trim().isEmpty()) {
            return Response.buildFailure("100301", "用户ID不能为空");
        }
        // 调用Service重置密码（如默认密码123456，或自定义密码）
        return userService.resetPassword(cmd);
    }


    /**
     * 查询所有可分配的角色（下拉选项）
     * 对应页面：用户新增/编辑弹窗「角色选择」下拉数据源
     */
    @GetMapping("getRolesSelectList")
    @ApiOperation("查询后台角色可选择列表")
    public SingleResponse<List<RoleVO>> getBackRoleSelectList() {
        // 调用RoleService查询所有角色（复用您现有逻辑）
        return SingleResponse.of(roleService.list().stream()
                .filter(roleVO -> !roleVO.getRoleCode().equals("SUPER_ADMIN"))
                .map(role -> {
                    RoleVO roleVO = new RoleVO();
                    roleVO.setId(role.getId());
                    roleVO.setRoleName(role.getRoleName());
                    roleVO.setRoleCode(role.getRoleCode());
                    return roleVO;
                }).collect(Collectors.toList()));
    }


    /**
     * 导出后台用户（Excel）
     * 对应页面：用户列表页「导出」按钮
     */
    @GetMapping("export")
    @ApiOperation("导出后台用户列表（Excel）")
    public void exportBackUser(@Valid ExportUserCmd cmd, HttpServletResponse response) throws IOException {
        // 调用Service处理Excel导出（直接写入响应流，浏览器下载）
        userService.exportUser(cmd, response);
    }


}